package juc.ignore;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

/**
 * ConcurrentSkipListMap是线程安全的有序的哈希表,适用于高并发的场景
 * <p>
 * * ConcurrentSkipListMap和TreeMap
 * * 相同点: 它们虽然都是有序的哈希表
 * * 不同点: TreeMap是非线程安全的,而ConcurrentSkipListMap是线程安全的
 * * 相同点: ConcurrentSkipListMap是通过跳表实现的,而TreeMap是通过红黑树实现的
 * <p>
 * * ConcurrentSkipListMap和ConcurrentHashMap
 * * 在线程1.6万数据的条件下,ConcurrentHashMap存取速度是ConcurrentSkipListMap的4倍左右。
 * * 但ConcurrentSkipListMap有几个ConcurrentHashMap不能比拟的优点:
 * * 1、ConcurrentSkipListMap 的key是有序的
 * * 2、ConcurrentSkipListMap 支持更高的并发
 * * * ConcurrentSkipListMap 的存取时间是log（N）,和线程数几乎无关。也就是说在数据量一定的情况下,并发的线程越多,ConcurrentSkipListMap越能体现出他的优势。
 * <p>
 * * 非多线程--->TreeMap
 * * 低并发----->Collections.synchronizedSortedMap将TreeMap进行包装
 * * 高并发--->ConcurrentSkipListMap
 *
 * @author 王霄
 * @date 2021/9/20 10:03
 */
public class ConcurrentSkipListMapDemo {

    //private static final Map<Integer, String> map = new ConcurrentSkipListMap<>();
    //private static final Map<Integer, String> map = new TreeMap<>();
    private static final Map<Integer, String> map = new HashMap<>();

    public static void main(String[] args) {
        Random random = new Random();
        System.out.println(map.getClass());
        new Thread(() -> {
            long i = 0;
            while (i < 100) {
                map.putIfAbsent(random.nextInt(100), "");
                System.out.println(map.keySet());
                i++;
            }
        }).start();
        new Thread(() -> {
            long i = 0;
            while (i < 100) {
                map.putIfAbsent(random.nextInt(100), "");
                System.out.println(map.keySet());
                i++;
            }
        }).start();


    }
}
